//
//  SYUseAccount.swift
//  SingWeibo
//
//  Created by shiying on 15/12/18.
//  Copyright © 2015年 shiying. All rights reserved.
//
/*
    返回值字段	字段类型	字段说明
    access_token	string	用于调用access_token，接口获取授权后的access token。
    expires_in	string	access_token的生命周期，单位是秒数。
    remind_in	string	access_token的生命周期（该参数即将废弃，开发者请使用expires_in）。
    uid	string	当前授权用户的UID。
*/


import UIKit

class SYUseAccount: NSObject ,NSCoding{
    
    /// 判断是否登录
    class var userLogin: Bool {
        return SYUseAccount.loadUserAccount() != nil
        // 可以get方法
    }
    
    //MARK: - 定义可选属性，可以随时赋值
    /// Access_token
     var access_token: String?
    /// 当前授权用户的UID
     var uid: String?
    /// 生命周期，单位是秒数
     var expires_in: NSTimeInterval = 0 {
        didSet {
        
            expires_Date = NSDate(timeIntervalSinceNow: expires_in)
        }
    }
    /// 过期时间
     var expires_Date: NSDate?
    
    /// 用户昵称
    var screen_name: String?
    
    /// 用户头像地址
    var avatar_large: String?
    
    //MARK: - 字典转模型
    init(dict: [String: AnyObject]) {
        // 属性不是特别多的时候可以直接单个赋值
        super.init()
        // KVC,方法必须在init后面调用
        setValuesForKeysWithDictionary(dict)
    }
    /// 字典有其他的键值对没有的时候，就要调用这个方法
    override func setValue(value: AnyObject?, forUndefinedKey key: String) {
        
    }
    
    override var description: String {
        get{
            return "access_token: \(access_token), uid: \(uid), expires_in: \(expires_in), expires_Date \(expires_Date)"
        }
    }
    
    /// 归档
    func encodeWithCoder(aCoder: NSCoder) {
        aCoder.encodeObject(access_token, forKey: "access_token")
        aCoder.encodeObject(uid, forKey: "uid")
        aCoder.encodeDouble(expires_in, forKey: "expires_in")
        aCoder.encodeObject(expires_Date, forKey: "expires_Date")
        aCoder.encodeObject(screen_name, forKey: "screen_name")
        aCoder.encodeObject(avatar_large, forKey: "avatar_large")
        
    }
    
    /// 解档
    required init?(coder aDecoder: NSCoder) {
        access_token = aDecoder.decodeObjectForKey("access_token") as? String
        uid = aDecoder.decodeObjectForKey("uid") as? String
        expires_in = aDecoder.decodeDoubleForKey("expires_in")
        expires_Date = aDecoder.decodeObjectForKey("expires_Date") as? NSDate
        screen_name = aDecoder.decodeObjectForKey("screen_name") as? String
        avatar_large = aDecoder.decodeObjectForKey("avatar_large") as? String
    }
    
    /// 保存文件路径
    static let path = (NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last! as NSString).stringByAppendingPathComponent("userAccount.plist")
    
    /// 保存文件
    func saveUserAccount() {
        NSKeyedArchiver.archiveRootObject(self, toFile: SYUseAccount.path)
//        print("saveUserAccount --\(SYUseAccount.path)")
    }
    
    // 程序一开始解没有账号，需要写成类方法  ，多次调用该方法，所以就写成类方法
    static var userAccount: SYUseAccount?
    
    class func loadUserAccount() -> SYUseAccount? {
        // 去内存（userAccount）属性中找
        if userAccount == nil {
            // 如果内存中没有，去沙盒里面解档用户信息，沙盒也不一定能解档出用户信息
           userAccount = NSKeyedUnarchiver.unarchiveObjectWithFile(path) as? SYUseAccount
        }
        
        // 不能确定一定有对象，有账号，还要判断是否过期
        if userAccount != nil && userAccount?.expires_Date?.compare(NSDate()) == NSComparisonResult.OrderedDescending {
            print("加载到可用账号")
            return userAccount
        }
        return nil 
    }
    
    //MARK: -调用工具类的方法，加载用户信息
    func loadUserInfo(finished: (error: NSError?) ->()) {
        SYAFNTool.sharedInsetace.loadUserInfo { (reslut, error) -> () in
            // 判断是否又错误
            if error != nil || reslut == nil {
                print("加载用户数据有错误\(error)")
                finished(error: error)
                return
            }
            
            self.screen_name = reslut!["screen_name"] as? String
            self.avatar_large = reslut!["avatar_large"] as? String
            
            // 将最新的对象保存到沙盒
            self.saveUserAccount()
            
            SYUseAccount.userAccount = self
            
            finished(error: nil)
            
        }
    }
    

/*    func loadUserAccount() -> SYUseAccount? {
        /// 获取账户信息路径
        if let userAccount = NSKeyedUnarchiver.unarchiveObjectWithFile(path) as? SYUseAccount {
        
            //能来到这里说明useAccount 有值
            if userAccount.expires_Date?.compare(NSDate()) == NSComparisonResult.OrderedDescending {
                print("可用账号")
                return userAccount
            } else {
                print("账号过期了")
                return nil
            }
        
        } else {
            print("没有账号")

        }
        return nil
    }*/

}
